package taller.dataLayer.managers;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.jms.JMSException;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import taller.dataLayer.entities.SolicitudCompra;
import taller.dataLayer.vo.ItemCotizacionVO;
import taller.dataLayer.vo.ItemSolicitudCompraVO;
import taller.dataLayer.vo.RodamientoVO;
import taller.dataLayer.vo.SolicitudCompraVO;
import taller.excepcion.ParserException;
import taller.integrationLayer.caller.EmisorSolicitudCompra;

@Stateless
public class AdministradorSolicitudesCompraBean implements AdministradorSolicitudesCompra {
	@PersistenceContext(name="taller14")
	EntityManager entityManager;

	@EJB(beanName="AdministradorCotizacionesBean")
	private AdministradorCotizaciones adminCotizaciones;
	
	@EJB(beanName="AdministradorParametrosBean")
	private AdministradorParametros adminParam;
	
	@EJB(beanName="EmisorSolicitudCompraBean")
	private EmisorSolicitudCompra emisorSolicitudCompra;
	
    public AdministradorSolicitudesCompraBean() {
    }

    public void guardar(SolicitudCompraVO solicitudCompra) {
    	
    	for (ItemSolicitudCompraVO itemCompraVo : solicitudCompra.getItems()) {
    		RodamientoVO rod = itemCompraVo.getRodamiento();
    		ItemCotizacionVO itemCotizaciionVo = adminCotizaciones.buscarUltimaCotizacionParaRodamiento(rod);
    		if (itemCotizaciionVo != null) {
				itemCompraVo.setUltimoItemCotizacion(itemCotizaciionVo);
			}
		}
    	
    	solicitudCompra.setNumeroTaller(adminParam.getNumeroTaller());
    	SolicitudCompra solicitudCompraEB = new SolicitudCompra();
    	solicitudCompraEB.setVO(solicitudCompra);

    	if (solicitudCompra.getNumero() != null && this.buscar(solicitudCompra) != null) {
			entityManager.merge(solicitudCompraEB);
		} else {
			solicitudCompraEB.setFecha(new Date());
	    	//solicitudCompraEB.setNumeroTaller(adminParam.getNumeroTaller());
	    	solicitudCompraEB.setNumero(null);
	    	
			entityManager.persist(solicitudCompraEB);
			solicitudCompra.setNumero(solicitudCompraEB.getNumero());
		}
    }
    
    public void guardarNuevaSolicitudYEnviar(SolicitudCompraVO solicitudCompra) 
    		throws JMSException, NamingException, ParserException {
    	this.guardar(solicitudCompra);
    	
		emisorSolicitudCompra.enviarSolicitudDeCompra(solicitudCompra);
    }
    
	public SolicitudCompraVO buscar(SolicitudCompraVO solicitudCompra) {
		SolicitudCompra retVal = (SolicitudCompra) entityManager.find(SolicitudCompra.class, solicitudCompra.getNumero());
		return retVal != null? retVal.getVO() : null;
	}
	
	@SuppressWarnings("unchecked")
	public List<SolicitudCompraVO> buscarTodas() {
		List<SolicitudCompra> solicitudes = entityManager.createQuery("from SolicitudCompra").getResultList();
		List<SolicitudCompraVO> solicitudesVO = new ArrayList<SolicitudCompraVO>();
		Iterator<SolicitudCompra> i = solicitudes.iterator();
		while(i.hasNext()){
			SolicitudCompraVO solicitud = i.next().getVO();
			solicitudesVO.add(solicitud);
		}
		
		return solicitudesVO;
	}
}
